/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.ihale.tedarikci;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.bean.RequestScoped;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.ihale.database.Database;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.validator.ValidatorException;
import org.ihale.Ihale;
import org.ihale.Kalem;
import org.ihale.database.DatabaseEmre;
import org.ihale.database.DatabaseMehmet;
import org.ihale.database.DatabaseYakup;
import org.login.LoginBean;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;
import org.teklif.Teklif;

/**
 *
 * @author Emre
 */
@ManagedBean
@SessionScoped
public class TedarikciBean {

    /** Creates a new instance of TedarikciBean */
    // Değişkenler için alan başlangıcı
    private String Tedarikci_id;
    private Tedarikci getirilenTedarikci;
    private Ihale seciliIhale;
    private List<Kalem> kalemler;
    private List<Teklif> teklifler;
    private Ihale secilenIhaleToGoruntule = new Ihale();
    private List<Ihale> listeIhale = new ArrayList<Ihale>();
    private List<Tedarikci> listeTedarikciToIhaleGoruntule = new ArrayList<Tedarikci>();
    private int toplamTeklifFiyati;
    private StreamedContent file;
    private boolean belgevarmi;
    
    public boolean isBelgevarmi() {
        if (secilenIhaleToGoruntule.getBelge() == null) {
            setBelgevarmi(false);
        } else {
            setBelgevarmi(true);
        }
        return belgevarmi;
    }

    public void setBelgevarmi(boolean belgevarmi) {
        this.belgevarmi = belgevarmi;
    }

    public TedarikciBean() {
        try {
            seciliIhale = new Ihale();

            kalemler = new LinkedList<Kalem>();
            teklifler = new LinkedList<Teklif>();
            DatabaseYakup dby = new DatabaseYakup();
            dby.connect();

            dby.disconnect();
            Database database = new Database();
            try {
                database.connect();

                database.disconnect();
            } catch (Exception e) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Liste veri tabanından alınamadı!"));
                System.out.println(e.toString());
            }
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(TedarikciBean.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(TedarikciBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    // Değişkenler için alan bitişi
    // Fonksiyonlar için alan başlangıcı
    public void getirTedarikci() {
        Database database = new Database();

        try {
            database.connect();
            this.getirilenTedarikci = database.getirTedarikci(this.Tedarikci_id);
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Satın almacı eklendi."));

            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Satın almacı eklenemedi."));

            database.disconnect();

        } catch (Exception e) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Kaldırma işlemi başarısız."));
            System.out.println(e.toString());
        }

    }

    public StreamedContent getFile() {
        ExternalContext extContext = FacesContext.getCurrentInstance().getExternalContext();
        InputStream stream = extContext.getResourceAsStream("/Docs" + File.separator + secilenIhaleToGoruntule.getBelge());
        String[] tmp;
        tmp = secilenIhaleToGoruntule.getBelge().split("\\.");
        // InputStream stream = new FileInputStream(new File("C:"+File.separator+"kpds20110201ingilizcemaster.pdf"));
        System.out.println(tmp[0]);
        System.out.println(tmp[1]);
        file = new DefaultStreamedContent(stream, "application/" + tmp[1], secilenIhaleToGoruntule.getBelge());

        return file;
    }

    public void listeIhaleSimdiki() throws ClassNotFoundException, SQLException, IOException {
        DatabaseEmre db = new DatabaseEmre();
        db.connect();
        listeIhale = db.listeleIhaleSimdikiToTedarikci();

        db.disconnect();
        FacesContext.getCurrentInstance().getExternalContext().redirect("TedarikciIhaleleriGoruntule.xhtml");
    }

    public void listeIhaleGelecek() throws ClassNotFoundException, SQLException, IOException {
        DatabaseEmre db = new DatabaseEmre();
        db.connect();
        listeIhale = db.listeleIhaleGelecekToTedarikci();

        db.disconnect();
        FacesContext.getCurrentInstance().getExternalContext().redirect("TedarikciGelecekIhaleleriGoruntule.xhtml");
    }

    public void tedarikciIhaleDetay() {
        DatabaseEmre db = new DatabaseEmre();
        try {
            db.connect();
            listeTedarikciToIhaleGoruntule = db.listeTedarikciToIhale(secilenIhaleToGoruntule.getId());
            db.disconnect();
            FacesContext.getCurrentInstance().getExternalContext().redirect("TedarikciIhaleDetay.xhtml");
        } catch (Exception e) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Kaldırma işlemi başarısız."));
            System.out.println(e.toString());
        }
    }

    public void teklifVer() throws IOException, SQLException {
        Teklif teklif;
        teklifler.clear();

        if (seciliIhale.getDonmaDurumu().equals("Donduruldu")) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Bu ihale şu anda dondurulmuş durumdadır. Daha sonra tekrar deneyin!"));
            return;
        }

        DatabaseYakup dby = new DatabaseYakup();
        LoginBean loginBean = new LoginBean();
                    loginBean = (LoginBean) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("loginBean");
                    Tedarikci tedarikci = new Tedarikci();
                    tedarikci = loginBean.getTedarikci();
        int max_no=0;
        try {
            dby.connect();

            kalemler = dby.getirKalemlerForTeklif(seciliIhale);
              max_no=dby.getir_Max_Teklif_No(tedarikci.getId());   
            dby.disconnect();
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(TedarikciBean.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(TedarikciBean.class.getName()).log(Level.SEVERE, null, ex);
        }
        
          
        DatabaseMehmet dbmehmet =new DatabaseMehmet();
            try {
                dbmehmet.connect();
            } catch (ClassNotFoundException ex) {
                Logger.getLogger(TedarikciBean.class.getName()).log(Level.SEVERE, null, ex);
            }
                
        for (Kalem kalem : kalemler) {
            System.out.println(kalem.getAciklama() + kalem.getBirim() + kalem.getKalemAdi());
       teklif = new Teklif(kalem, dbmehmet.getMinTeklifUcreti (max_no, tedarikci.getId(), kalem.getKalem()));      
            teklifler.add(teklif);
        }
        System.out.println(teklifler.size());
        FacesContext.getCurrentInstance().getExternalContext().redirect("TedarikciTeklifVer.xhtml");
    }

    public void teklifKaydet() {
        try {
            DatabaseYakup dby = new DatabaseYakup();
            LoginBean loginBean = new LoginBean();
            loginBean = (LoginBean) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("loginBean");
            Tedarikci tedarikci = new Tedarikci();
            tedarikci = loginBean.getTedarikci();
            int toplam = 0;
            dby.connect();
            int max_teklif_no = dby.getir_Max_Teklif_No(tedarikci.getId());
            int yeni_teklif_no = max_teklif_no + 1;
            int min_fiyat = dby.minTeklifiGetir(seciliIhale).getTeklif();
            for (Teklif teklif : teklifler) {

                if (teklif.getKalem().getBaslangicFiyati() < teklif.getTeklif() & teklif.getKalem().getBaslangicFiyati() != 0) {
                    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(teklif.getKalem().getKalemAdi() + "için maksimum fiyattan yüksek değer teklif edemezsiniz"));
                } else {
                    toplam = toplam + teklif.getKalem().getMiktari() * teklif.getTeklif();
                    loginBean = new LoginBean();
                    loginBean = (LoginBean) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("loginBean");
                    tedarikci = new Tedarikci();
                    tedarikci = loginBean.getTedarikci();
                    if (max_teklif_no == -1) {
                        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Teklif gönderilirken bir hata oluştu. Lütfen sistem yöneticinize başvurun."));
                    } else {
                        dby.ekleTeklif(teklif, tedarikci.getId(), yeni_teklif_no);
                    }
                }
            }

            dby.disconnect();




            //  int min_fiyat=bul_Ihaledeki_Min_Teklif_Fiyati(dbmehmet.getirIhaledeki_Tedarikcilerin_Id_Listesi(teklifler.get(1).getKalem().getKalem()));

            if (min_fiyat < toplam & min_fiyat != 0) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Son teklifiniz ihaledeki en düşük fiyat olamamıştır!"));
            } else {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Tebrikler, son teklifiniz şu anda ihaledeki en düşük fiyat olmuştur!"));
            }



        } catch (ClassNotFoundException ex) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Teklif gönderilirken bir hata oluştu. Lütfen daha sonra tekrar deneyin."));
            Logger.getLogger(TedarikciBean.class.getName()).log(Level.SEVERE, null, ex);

        } catch (SQLException ex) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Teklif gönderilirken bir hata oluştu. Lütfen daha sonra tekrar deneyin!"));
            Logger.getLogger(TedarikciBean.class.getName()).log(Level.SEVERE, null, ex);

        }

        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Teklif başarıyla gönderildi."));



    }

    public void teklifHesapla() throws IOException {
        try {
            DatabaseYakup dby = new DatabaseYakup();
            LoginBean loginBean = new LoginBean();
            loginBean = (LoginBean) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("loginBean");
            Tedarikci tedarikci = new Tedarikci();
            tedarikci = loginBean.getTedarikci();

            dby.connect();
            int toplam = 0;
            boolean bozuk_teklif = false;
            for (Teklif teklif : teklifler) {

                if (teklif.getKalem().getBaslangicFiyati() < teklif.getTeklif() & teklif.getKalem().getBaslangicFiyati() != 0) {
                    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(teklif.getKalem().getKalemAdi() + "için maksimum fiyattan yüksek değer teklif edemezsiniz"));
                    bozuk_teklif = true;

                } else {
                    toplam = toplam + teklif.getKalem().getMiktari() * teklif.getTeklif();
                    loginBean = new LoginBean();
                    loginBean = (LoginBean) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("loginBean");
                    tedarikci = new Tedarikci();
                    tedarikci = loginBean.getTedarikci();

                }
            }
            int max_teklif_no = dby.getir_Max_Teklif_No(tedarikci.getId());
            toplamTeklifFiyati = toplam;
            dby.disconnect();

            if (!bozuk_teklif) {

                DatabaseMehmet dbmehmet = new DatabaseMehmet();
                dbmehmet.connect();
                //      int ihale_no=dbmehmet.bul_IhaleNo_Tedid(tedarikci.getId());
                int eski_max = dbmehmet.tedarikci_min_teklif(tedarikci.getId(), this.seciliIhale);
                dbmehmet.disconnect();

                if (eski_max != 0) {
                    if (toplam < eski_max) {
                        FacesContext.getCurrentInstance().getExternalContext().redirect("TedarikciTeklifGorveGonder.xhtml");
//                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Teklif tamam toplam fiyat:"+toplam));

                    } else {
                        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Bu teklif en düşük teklifinizden daha yüksek. Toplam fiyat:" + toplam + " Daha önceki en düşük teklifiniz=" + eski_max + " Lütfen teklifinizi değiştirip tekrardan deneyin."));
                    }
                } else {
                    FacesContext.getCurrentInstance().getExternalContext().redirect("TedarikciTeklifGorveGonder.xhtml");
                }


            }
            //  else
            //    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Teklif kalemlerinden biri mim değerden fazla:"+toplam));



        } catch (ClassNotFoundException ex) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Teklif gönderilirken bir hata oluştu. Lütfen daha sonra tekrar deneyin."));
            Logger.getLogger(TedarikciBean.class.getName()).log(Level.SEVERE, null, ex);

        } catch (SQLException ex) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Teklif gönderilirken bir hata oluştu. Lütfen daha sonra tekrar deneyin!"));
            Logger.getLogger(TedarikciBean.class.getName()).log(Level.SEVERE, null, ex);

        }

//FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Teklif başarıyla gönderildi."));



    }

    public int bul_Ihaledeki_Min_Teklif_Fiyati(List ted_idList) throws ClassNotFoundException {

        int ted_id;
        int max_teklif_no;//min teklif fiyatının numarası oluyor aynı zamanda
        int min_teklif_fiyati = -1;
        int temp_fiyat = -1;
        Iterator it = ted_idList.iterator();
        DatabaseMehmet dbMehmet = new DatabaseMehmet();
        try {
            dbMehmet.connect();

            while (it.hasNext()) {
                ted_id = new Integer(it.next().toString());
                max_teklif_no = dbMehmet.getir_Max_Tam_Teklif_No(ted_id);
                temp_fiyat = dbMehmet.tedarikci_min_teklif(ted_id, this.seciliIhale);
                if (min_teklif_fiyati == -1) {
                    min_teklif_fiyati = temp_fiyat;
                } else {
                    if (temp_fiyat < min_teklif_fiyati) {
                        min_teklif_fiyati = temp_fiyat;
                    }
                }

            }
            dbMehmet.disconnect();
        } catch (SQLException ex) {
            Logger.getLogger(TedarikciBean.class.getName()).log(Level.SEVERE, null, ex);

        }
        return min_teklif_fiyati;

    }

    public void teklif_verme_ekranına_yonlendir() throws IOException {
        FacesContext.getCurrentInstance().getExternalContext().redirect("TedarikciTeklifVer.xhtml");

    }

//    public void validateTeklif(FacesContext context,UIComponent component, Object value){
//        // <f:validateRegex pattern="^[1-9]+[0-9]*$"></f:validateRegex> 
//        FacesMessage msg = new FacesMessage("");
//        String inputFromField = (String) value;
//        String simpleTextPatternText = "^[1-9]+[0-9]*$";
//        Pattern textPattern = null;
//        Matcher teklifValueMatcher = null;
//        textPattern = Pattern.compile(simpleTextPatternText);
//        teklifValueMatcher = textPattern.matcher(inputFromField); 
//        if (!teklifValueMatcher.matches()) {
//            msg = new FacesMessage("Only digits allowed");
//            throw new ValidatorException(msg);
//        }
//
//        if (inputFromField.length() <= 0) {
//            msg = new FacesMessage("You must enter a value greater than 0");
//            throw new ValidatorException(msg);
//        }
//
//        if (Integer.parseInt(inputFromField.toString().trim()) <= 0) {
//            msg = new FacesMessage("0 or bellow is not permited");
//            throw new ValidatorException(msg);
//        } 
//    }
//     
    // Fonksiyonlar için alan bitişi
    // Getter-Setter için alan başlangıcı
    public Ihale getSeciliIhale() {
        return seciliIhale;
    }

    public void setSeciliIhale(Ihale seciliIhale) {
        this.seciliIhale = seciliIhale;
    }

    public String getTedarikci_id() {
        return Tedarikci_id;
    }

    public void setTedarikci_id(String Tedarikci_id) {
        this.Tedarikci_id = Tedarikci_id;
    }

    public Tedarikci getGetirilenTedarikci() {
        return getirilenTedarikci;
    }

    public void setGetirilenTedarikci(Tedarikci getirilenTedarikci) {
        this.getirilenTedarikci = getirilenTedarikci;
    }

    public List<Kalem> getKalemler() {
        return kalemler;
    }

    public void setKalemler(List<Kalem> kalemler) {
        this.kalemler = kalemler;
    }

    public List<Teklif> getTeklifler() {
        return teklifler;
    }

    public void setTeklifler(List<Teklif> teklifler) {
        this.teklifler = teklifler;
    }

    public List<Ihale> getListeIhale() {
        return listeIhale;
    }

    public void setListeIhale(List<Ihale> listeIhale) {
        this.listeIhale = listeIhale;
    }

    public Ihale getSecilenIhaleToGoruntule() {
        return secilenIhaleToGoruntule;
    }

    public void setSecilenIhaleToGoruntule(Ihale secilenIhaleToGoruntule) {
        this.secilenIhaleToGoruntule = secilenIhaleToGoruntule;
    }

    public List<Tedarikci> getListeTedarikciToIhaleGoruntule() {
        return listeTedarikciToIhaleGoruntule;
    }

    public void setListeTedarikciToIhaleGoruntule(List<Tedarikci> listeTedarikciToIhaleGoruntule) {
        this.listeTedarikciToIhaleGoruntule = listeTedarikciToIhaleGoruntule;
    }

    public int getToplamTeklifFiyati() {
        return toplamTeklifFiyati;
    }

    public void setToplamTeklifFiyati(int toplamTeklifFiyati) {
        this.toplamTeklifFiyati = toplamTeklifFiyati;
    }
    // Getter-Setter için alan bitişi
}